package cn.net.trimmer.servlet.demo1.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * jdbc 模板,封装增删改查的方法
 * 
 * @author wl
 *
 */
public class JdbcTemplate<T> {

	/**
	 * 查一条
	 * 
	 * @param sql       要发送到数据库的sql语句
	 * @param rowMapper 行映射接口实现
	 * @param args      参数表
	 * @return 查询结果
	 */
	public T queryOne(String sql, RowMapper<T> rowMapper, Object... args) {
		T row = null;
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		try {
			// 获取连接
			conn = JdbcUtils.getConn();
			// 创建sql发送工具
			pstm = conn.prepareStatement(sql);
			// 给占位符赋值
			if (hasUpdateParam(args)) {
				// 注意,占位符的下标是从1开始的
				for (int i = 0; i < args.length; i++) {
					pstm.setObject(i+1, args[i]);					
				}
			}
			// 发送sql并接收查询结果
			rs = pstm.executeQuery();
			// 处理查询结果
			while(rs.next()) {
				row = rowMapper.mapRow(rs);
			}									
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			// 关闭资源-dao层不关连接
			JdbcUtils.release(rs, pstm, null);
		}
		return row;
	}

	/**
	 * 修改或删除模板
	 * 
	 * @param sql  要发送到数据库的sql语句
	 * @param args 参数表
	 */
	public void update(String sql, Object... args) {
		Connection conn = null;
		PreparedStatement pstm = null;
		try {
			// 获取连接
			conn = JdbcUtils.getConn();
			// 创建sql发送工具
			pstm = conn.prepareStatement(sql);
			// 给占位符赋值
			if (hasUpdateParam(args)) {
				// 注意,占位符的下标是从1开始的
				for (int i = 0; i < args.length; i++) {
					pstm.setObject(i+1, args[i]);
				}
			}
			// 发送sql
			pstm.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			// 关闭资源-dao层不关连接
			JdbcUtils.release(null, pstm, null);
		}
	}

	/**
	 * 查询所有模板
	 * 
	 * @param sql       要发送到数据库的sql语句
	 * @param rowMapper 行映射接口实现
	 * @param args      参数表
	 * @return 结果集集合
	 */
	public List<T> queryAll(String sql, RowMapper<T> rowMapper, Object... args) {
		List<T> list = null;
		Connection conn = null;
		PreparedStatement pstm = null;
		ResultSet rs = null;
		try {
			// 获取连接
			conn = JdbcUtils.getConn();
			// 创建sql发送工具
			pstm = conn.prepareStatement(sql);
			// 给占位符赋值
			if (hasUpdateParam(args)) {
				// 注意,占位符的下标是从1开始的
				for (int i = 0; i < args.length; ) {
					pstm.setObject(i+1, args[i]);
					i++;
				}
			}
			// 发送sql并接收查询结果
			rs = pstm.executeQuery();
			list = new ArrayList<>();
			// 处理查询结果
			while (rs.next()) {
				T row = rowMapper.mapRow(rs);
				list.add(row);
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		} finally {
			// 关闭资源-dao层不关连接
			JdbcUtils.release(rs, pstm, null);
		}
		return list;
	}

	/**
	 * 是否有参数判断
	 * 
	 * @param args 参数表
	 * @return 参数表有参则返回true,参数表无参返回false
	 */
	public static boolean hasUpdateParam(Object... args) {
		return args.length != 0;
	}
}
